
(function (global) {
    /**
        * COOKIE变量名。微前端从全局变量获取。非微前端，可以自行根据当前环境修改该变量。
        */
    const COOKIENAME = window.saasData.common.cookieName;

    /**
        * 获取cookie
        * @param {*} name 
        */
    function getCookie(name) {
        var arr, reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)");
        if (arr = document.cookie.match(reg))
            return unescape(arr[2]);
        else
            return null;
    }
    /**
        * 获取当前token
        */
    let token = getCookie(COOKIENAME);

    /**
        * 入口方法。执行可写接口测试。
        * @param {*} interfaces 
        */
    global.authCheck = async function (interfaces) {
        let stat = {
            total: interfaces.length, //接口总数
            intercept: 0, //拦截数
            pass: 0 //没有拦截数
        };
        console.log('===========验证输入的接口集合是否被拦截============');

        for (let interface of interfaces) {
            let result = await checkInterfaceWritableStatus(interface);
            if (result == "") {
                console.log('【越权】%c接口【${interface}】被拦截。', "color:green");
                stat.intercept++;
            } else {
                console.log('【越权】%c接口【${interface}】未被拦截.【${result}】', "color:red");
                stat.pass++;
            }
        }
        console.log('=======测试结束。接口总数：${stat.total};拦截数：${stat.intercept};未拦截数：${stat.pass}=======');
    }
    /**
        * 判断接口是否返回1042。1042：表示不允许调用。
        * 从该错误码能得知：当前用户是越权用户，且没有可写权限，却调用了可写接口。
        * @param {*} interface 接口path，/api3开头。
        * 返回空字符串，标识被拦截。
        * 如果未拦截，返回相关错误消息。
        */
    let checkInterfaceWritableStatus = async function (interface) {
        try {
            let includeapi3 = /^\/api3\//.test(interface);
            if (!includeapi3) {
                interface = "/api3" + interface;
            }

            let ret = await fetch(interface, {
                method: "POST",
                headers: {
                    'Content-Type': 'application/json',
                    'Authorization': 'Bearer ${token}'
                }
            });
            let response = await ret.json();


            return response.errcode == 1042 ? "" : (response.errmsg || "未被拦截。");
        } catch (err) {
            console.error(err);
            return err.message;
        }


    }


})(window);




/**
  * 接口列表，目前各业务方登记的 可写接口集合。
  * 微前端：找张勇；
  * 非微前端：自行按照格式录入
  */
var interfaces=["/api3/bc/biz/core/v2/merchant/solution/detailInfo"];

window.authCheck(interfaces);
